home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Programming / ace_gpl_release / src / ace / c / gfx.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-04  |  20.6 KB  |  938 lines

  1. /* << ACE >>
  2.  
  3.    -- Amiga BASIC Compiler --
  4.  
  5.    ** Parser: graphics functions **
  6.    ** Copyright (C) 1998 David Benn
  7.    ** 
  8.    ** This program is free software; you can redistribute it and/or
  9.    ** modify it under the terms of the GNU General Public License
  10.    ** as published by the Free Software Foundation; either version 2
  11.    ** of the License, or (at your option) any later version.
  12.    **
  13.    ** This program is distributed in the hope that it will be useful,
  14.    ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.    ** GNU General Public License for more details.
  17.    **
  18.    ** You should have received a copy of the GNU General Public License
  19.    ** along with this program; if not, write to the Free Software
  20.    ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21.  
  22.    Author: David J Benn
  23.      Date: 26th October-30th November, 1st-13th December 1991,
  24.        14th,20th-27th January 1992, 
  25.            2nd-17th, 21st-29th February 1992, 
  26.        1st,13th,14th,22nd,23rd March 1992,
  27.        21st,22nd April 1992,
  28.        2nd,3rd,11th,15th,16th May 1992,
  29.        7th,8th,9th,11th,13th,14th,28th,29th,30th June 1992,
  30.        2nd-8th,14th-19th,26th-29th July 1992,
  31.        1st-3rd,7th,8th,9th August 1992,
  32.        6th,7th,12th,13th December 1992,
  33.        4th January 1993,
  34.        1st July 1993,
  35.        6th February 1994,
  36.        14th July 1994,
  37.        28th August 1994
  38. */
  39.  
  40. #include "acedef.h"
  41.  
  42. /* locals */
  43. static    char    *frame_ptr[] = { "(a4)","(a5)" };
  44.  
  45. /* externals */
  46. extern    int    sym;
  47. extern    int    lev;
  48. extern    int    obj;
  49. extern    SHORT    shortval;
  50. extern    CODE    *curr_code;
  51. extern    SYM    *curr_item;
  52. extern    char    id[MAXIDSIZE];
  53.  
  54. /* functions */
  55. void pset()
  56. {
  57. BOOL relative;
  58. BOOL colorset=FALSE;
  59.  
  60.   insymbol();
  61.   if (sym == stepsym)
  62.   { 
  63.    insymbol();
  64.    relative=TRUE; 
  65.   }
  66.   else relative=FALSE;
  67.    
  68.   if (sym != lparen) _error(14);
  69.   else
  70.      {
  71.       /* x-coordinate */
  72.       insymbol();
  73.       make_sure_short(expr());
  74.       if (sym != comma) _error(16);
  75.       else
  76.       {
  77.        /* y-coordinate */
  78.        insymbol();
  79.        make_sure_short(expr());
  80.        if (sym != rparen) _error(9);
  81.        else
  82.        {
  83.     insymbol();
  84.     if (sym == comma)
  85.         {
  86.      /* pen color */
  87.      insymbol();
  88.      make_sure_short(expr());
  89.      gen("move.w","(sp)+","d0");
  90.      gen("move.l","_RPort","a1");
  91.      gen("move.l","_GfxBase","a6");
  92.      gen("jsr","_LVOSetAPen(a6)","  ");
  93.      enter_XREF("_LVOSetAPen");
  94.      enter_XREF("_GfxBase");
  95.      enter_XREF("_RPort");
  96.      colorset=TRUE;
  97.     }
  98.     else colorset=FALSE;
  99.        }
  100.        /* pop y-coordinate */
  101.        gen("move.w","(sp)+","d1");
  102.       }
  103.       /* pop x-coordinate */
  104.       gen("move.w","(sp)+","d0");
  105.      }    
  106.  
  107.      /* plot point */
  108.      if (!colorset)
  109.      {
  110.       gen("move.l","_GfxBase","a6");
  111.       enter_XREF("_GfxBase");
  112.       gen("move.l","_RPort","a1");
  113.       enter_XREF("_RPort");
  114.      }
  115.  
  116.      if (relative)
  117.      {
  118.        gen("add.w","36(a1)","d0");   /* x + RPort->cp_x */
  119.        gen("add.w","38(a1)","d1");   /* y + RPort->cp_y */
  120.        gen("jsr","_LVOMove(a6)","  ");
  121.        enter_XREF("_LVOMove");
  122.      }
  123.  
  124.      /* 
  125.      ** Save appropriate registers for call to WritePixel()
  126.      ** since Move() may clobber them.
  127.      */ 
  128.      gen("move.l","a1","a3");
  129.      gen("move.w","d0","d3");
  130.      gen("move.w","d1","d4");
  131.  
  132.      gen("jsr","_LVOMove(a6)","  ");
  133.  
  134.      /* 
  135.      ** Restore appropriate registers for call to WritePixel().
  136.      */
  137.      gen("move.w","d4","d1");    
  138.      gen("move.w","d3","d0");    
  139.      gen("move.l","a3","a1");
  140.          
  141.      gen("jsr","_LVOWritePixel(a6)","  ");
  142.  
  143.      enter_XREF("_LVOMove");  /* Must call Move() to change pen pos'n */
  144.      enter_XREF("_LVOWritePixel");  
  145.  
  146.      if (colorset)
  147.      {
  148.       /* change back to old pen */
  149.       gen("move.w","_fgdpen","d0");
  150.       gen("move.l","_RPort","a1");
  151.       gen("move.l","_GfxBase","a6");
  152.       gen("jsr","_LVOSetAPen(a6)","  ");
  153.       enter_XREF("_fgdpen");
  154.      }
  155. }
  156.  
  157. void paint()
  158. {
  159. BOOL paintcolor=FALSE;
  160. BOOL bordercolor=FALSE;
  161.  
  162.  /* PAINT (X,Y)[,paintcolor-id[,bordercolor-id]] */
  163.  
  164.  insymbol();
  165.  if (sym != lparen) _error(14);
  166.  else
  167.  {
  168.   insymbol();
  169.   make_sure_short(expr()); /* X */
  170.  
  171.   if (sym != comma) _error(16);
  172.   else
  173.   {
  174.    insymbol();
  175.    make_sure_short(expr()); /* Y */
  176.    
  177.    if (sym != rparen) _error(9);
  178.    else
  179.    {
  180.     insymbol();
  181.     if (sym == comma) 
  182.     {
  183.      insymbol();
  184.      if (sym != comma)
  185.      {
  186.       make_sure_short(expr()); /* paintcolor-id */
  187.       paintcolor=TRUE;
  188.      }
  189.      
  190.      if (sym == comma)
  191.      {
  192.       insymbol();
  193.       make_sure_short(expr()); /* bordercolor-id */
  194.       bordercolor=TRUE;
  195.      }
  196.     }
  197.    }
  198.    /* pop parameters */
  199.    if (bordercolor)
  200.       gen("move.w","(sp)+","d3");
  201.    else
  202.       gen("moveq","#-1","d3");  /* flag no border color-id */
  203.  
  204.    if (paintcolor)
  205.       gen("move.w","(sp)+","d2");
  206.    else
  207.       gen("moveq","#-1","d2");  /* flag no paint color-id */
  208.  
  209.    gen("move.w","(sp)+","d1");  /* Y */
  210.    gen("move.w","(sp)+","d0");  /* X */
  211.    
  212.    /* call paint routine */
  213.    gen("jsr","_paint","  ");
  214.    enter_XREF("_paint");
  215.    enter_XREF("_GfxBase");
  216.   }
  217.  }
  218. }
  219.  
  220. void circle()
  221. {
  222. BOOL relative;
  223. BOOL colorset=FALSE;
  224. BOOL start_angle=FALSE;
  225. BOOL end_angle=FALSE;
  226. BOOL aspect=FALSE;
  227.  
  228.   insymbol();
  229.   if (sym == stepsym)
  230.   { 
  231.    insymbol();
  232.    relative=TRUE; 
  233.   }
  234.   else relative=FALSE;
  235.    
  236.   if (sym != lparen) { _error(14); return; }
  237.   else
  238.      {
  239.       /* x-coordinate */
  240.       insymbol();
  241.       make_sure_short(expr());
  242.       if (sym != comma) { _error(16); return; }
  243.       else
  244.       {
  245.        /* y-coordinate */
  246.        insymbol();
  247.        make_sure_short(expr());
  248.        if (sym != rparen) { _error(9); return; }
  249.        else
  250.        {
  251.     insymbol();
  252.     if (sym != comma) 
  253.            { _error(29); return; } /* radius expected -> no point going on */
  254.         else
  255.         {
  256.      /* radius */
  257.      insymbol();
  258.      gen_Flt(expr());
  259.         }
  260.        }
  261.       }
  262.      }
  263.   
  264.      if (sym == comma)
  265.      {
  266.       /* color */
  267.       insymbol();
  268.       if (sym != comma)   /* else skipping to next parameter (start angle) */
  269.       {
  270.        make_sure_short(expr());
  271.        gen("move.w","(sp)+","d0");
  272.        gen("move.l","_RPort","a1");
  273.        gen("move.l","_GfxBase","a6");
  274.        gen("jsr","_LVOSetAPen(a6)","  ");
  275.        enter_XREF("_LVOSetAPen");
  276.        enter_XREF("_GfxBase");
  277.        enter_XREF("_RPort");
  278.        colorset=TRUE;
  279.       }
  280.      }
  281.      else colorset=FALSE;
  282.   
  283.      /* start & end angle in <<degrees>> */
  284.  
  285.      if (sym == comma)
  286.      {
  287.       insymbol();
  288.       if (sym != comma)  /* else skip to end angle */
  289.       {
  290.        gen_Flt(expr());
  291.        gen("move.l","(sp)+","d3"); /* start angle */
  292.        start_angle=TRUE;
  293.       }
  294.  
  295.      if (sym == comma) 
  296.      {
  297.       insymbol();
  298.       if (sym != comma)  /* else skip to aspect */
  299.       {
  300.        if (!start_angle) _error(30); /* no start angle! */
  301.        gen_Flt(expr());
  302.        gen("move.l","(sp)+","d4"); /* end angle */
  303.        end_angle=TRUE;
  304.       }
  305.      }
  306.      else _error(16);  
  307.  
  308.      if (sym == comma)
  309.      {
  310.       /* aspect */
  311.       insymbol();
  312.       gen_Flt(expr());
  313.       gen("move.l","(sp)+","d5"); /* aspect */
  314.       aspect=TRUE;
  315.      }    
  316.     }
  317.   
  318.      /* pop radius & (x,y) coordinates */
  319.      gen("move.l","(sp)+","d2");      /* radius */
  320.      gen("move.w","(sp)+","_shorty"); /* y */
  321.      gen("move.w","(sp)+","_shortx"); /* x */
  322.  
  323.      if (relative)
  324.      {
  325.        gen("move.l","_RPort","a1");
  326.  
  327.        gen("move.w","_shortx","d0");
  328.        gen("add.w","36(a1)","d0");   /* x + RPort->cp_x */
  329.        gen("move.w","d0","_shortx");
  330.  
  331.        gen("move.w","_shorty","d0");
  332.        gen("add.w","38(a1)","d0");   /* y + RPort->cp_y */
  333.        gen("move.w","d0","_shorty");
  334.      }
  335.  
  336.      /* convert x & y values to floats */
  337.      gen("move.w","_shortx","d0");
  338.      gen("ext.l","d0","  ");
  339.      gen("move.l","_MathBase","a6");
  340.      gen("jsr","_LVOSPFlt(a6)","  ");
  341.      gen("move.l","d0","_floatx");
  342.  
  343.      gen("move.w","_shorty","d0");
  344.      gen("ext.l","d0","  ");
  345.      gen("move.l","_MathBase","a6");
  346.      gen("jsr","_LVOSPFlt(a6)","  ");
  347.      gen("move.l","d0","_floaty");
  348.  
  349.      gen("move.l","_floatx","d0");
  350.      gen("move.l","_floaty","d1");
  351.  
  352.      if (!start_angle) gen("moveq","#0","d3");  /* default is zero */
  353.      if (!end_angle)  gen("move.l","#$b3800049","d4");  /* default is 359 */
  354.      if (!aspect) gen("move.l","#$e147af3f","d5");  /* default is .44 */
  355.  
  356.      gen("jsr","_ellipse","  ");
  357.      enter_XREF("_ellipse");
  358.      enter_XREF("_GfxBase");
  359.      enter_XREF("_MathBase");
  360.      enter_XREF("_MathTransBase");  /* need these 3 libs for _ellipse */
  361.  
  362.      enter_BSS("_shortx","ds.w 1");
  363.      enter_BSS("_shorty","ds.w 1");
  364.      enter_BSS("_floatx","ds.l 1");
  365.      enter_BSS("_floaty","ds.l 1");
  366.    
  367.      if (colorset)
  368.      {
  369.       /* change back to old pen */
  370.       gen("move.w","_fgdpen","d0");
  371.       gen("move.l","_RPort","a1");
  372.       gen("move.l","_GfxBase","a6");
  373.       gen("jsr","_LVOSetAPen(a6)","  ");
  374.       enter_XREF("_fgdpen");
  375.      }          
  376. }
  377.  
  378. void draw_line()
  379. {
  380. BOOL relative=FALSE;
  381. BOOL colorset=FALSE;
  382. BOOL box=FALSE;
  383. BOOL boxfill=FALSE;
  384. CODE *cx,*cx1,*cx2,*cx3,*cx4,*cx5,*cx6;
  385.  
  386.  if (sym == stepsym)
  387.  {
  388.   relative=TRUE;
  389.   insymbol();
  390.  }
  391.  else relative=FALSE;
  392.  
  393.  if (sym != lparen)
  394.     _error(14);
  395.  else
  396.  {
  397.   insymbol();
  398.   make_sure_short(expr());  /* x */
  399.   if (sym != comma)
  400.      _error(16);
  401.   else
  402.   {
  403.    insymbol();
  404.    make_sure_short(expr()); /* y */
  405.    if (sym != rparen)
  406.       _error(9);
  407.    else
  408.    {
  409.     gen("move.w","(sp)+","d1");   /* ymin */
  410.     gen("move.w","(sp)+","d0");   /* xmin */
  411.     
  412.     /* save x1 & y1 since they may be changed by expr() calls below. */
  413.     gen("move.w","d0","_xmin");   cx1=curr_code;
  414.     gen("move.w","d1","_ymin");   cx2=curr_code;
  415.     enter_BSS("_xmin","ds.w 1");
  416.     enter_BSS("_ymin","ds.w 1");
  417.  
  418.     gen("move.l","_RPort","a1");
  419.     gen("move.l","_GfxBase","a6");
  420.     enter_XREF("_GfxBase");
  421.     enter_XREF("_RPort");
  422.  
  423.      if (!relative)
  424.      {
  425.       /* move to x,y */
  426.       gen("jsr","_LVOMove(a6)","  "); 
  427.       cx=curr_code;  /* don't need this Move for boxfill */
  428.       /* XREF declared by box or line (see below) */
  429.      }
  430.      
  431.      insymbol();
  432.     }
  433.    
  434.    /* second coordinate clause ? */
  435.    if (sym != minus)
  436.    {
  437.     if (relative)
  438.     {
  439.      /* no second coordinate clause */
  440.      /* draw line from last pen position to x,y */
  441.      gen("move.l","_RPort","a1");
  442.      gen("move.l","_GfxBase","a6");
  443.      gen("jsr","_LVODraw(a6)","  ");
  444.      enter_XREF("_LVODraw");
  445.     }
  446.     else _error(21);
  447.    }
  448.    else
  449.    {
  450.     insymbol();
  451.     if (sym != lparen)
  452.        _error(14);
  453.     else
  454.     {
  455.      insymbol();
  456.      make_sure_short(expr());  /* x */
  457.      if (sym != comma)
  458.         _error(16);
  459.      else
  460.      {
  461.       insymbol();
  462.       make_sure_short(expr()); /* y */
  463.       if (sym != rparen)
  464.          _error(9);
  465.       else
  466.       {
  467.        /* pen color ? */
  468.        insymbol();
  469.        if (sym == comma)
  470.        {
  471.     insymbol();
  472.     if (sym != comma)    /* ",," -> no color-id */
  473.         {
  474.      colorset=TRUE;
  475.      gen("move.w","_xmin","-(sp)");    /* save d0 & d1 */
  476.      cx3=curr_code;
  477.      gen("move.w","_ymin","-(sp)");
  478.      cx4=curr_code;
  479.          make_sure_short(expr());
  480.          gen("move.l","_RPort","a1");
  481.          gen("move.l","_GfxBase","a6");
  482.          gen("move.w","(sp)+","d0");
  483.          gen("jsr","_LVOSetAPen(a6)","  ");
  484.      gen("move.w","(sp)+","_ymin");
  485.      cx5=curr_code;
  486.      gen("move.w","(sp)+","_xmin");    /* restore d0 & d1 */
  487.      cx6=curr_code;
  488.          enter_XREF("_LVOSetAPen");
  489.     }
  490.         else colorset=FALSE;
  491.        }
  492.  
  493.        /* box or boxfill? */
  494.        if (sym == comma)
  495.        {
  496.         insymbol();
  497.     if (sym == ident)
  498.         {
  499.          if ((id[0]=='B') && ((id[1]=='\0') || (id[1]==':'))) box=TRUE;
  500.          else
  501.              if (((id[0]=='B') && (id[1]=='F'))
  502.                 && ((id[2]=='\0') || (id[2]==':'))) boxfill=TRUE;
  503.              else
  504.          _error(20);
  505.          insymbol();
  506.         }
  507.       }
  508.  
  509.       /* draw the line, outline box, or filled box */
  510.       if (box)
  511.       {
  512.     gen("move.w","(sp)+","d5");  /* y2 */
  513.     gen("move.w","(sp)+","d4");  /* x2 */
  514.     gen("move.w","_ymin","d3");     /* y1 */
  515.         gen("move.w","_xmin","d2");     /* x1 */
  516.            /* x1=d2; y1=d3 x2=d4; y2=d5 */
  517.            /* already moved to x1,y1 */
  518.         gen("move.l","_RPort","a1");
  519.         gen("move.l","_GfxBase","a6");
  520.         gen("move.w","d4","d0");    
  521.     gen("move.w","d3","d1");    
  522.     gen("jsr","_LVODraw(a6)","  "); /* x1,y1 - x2,y1 */
  523.         gen("move.w","d4","d0");    
  524.     gen("move.w","d5","d1");    
  525.     gen("jsr","_LVODraw(a6)","  "); /* x2,y1 - x2,y2 */
  526.         gen("move.w","d2","d0");    
  527.     gen("move.w","d5","d1");    
  528.     gen("jsr","_LVODraw(a6)","  "); /* x2,y2 - x1,y2 */
  529.         gen("move.w","d2","d0");    
  530.     gen("move.w","d3","d1");    
  531.     gen("jsr","_LVODraw(a6)","  "); /* x1,y2 - x1,y1 */
  532.     enter_XREF("_LVODraw");
  533.     enter_XREF("_LVOMove");
  534.         enter_BSS("_xmin","ds.w 1");
  535.         enter_BSS("_ymin","ds.w 1");
  536.       }        
  537.       else
  538.       if (boxfill)
  539.       {
  540.     change(cx,"nop","  ","  ");   /* don't need Move */
  541.         gen("move.l","_RPort","a1");
  542.         gen("move.l","_GfxBase","a6");
  543.     gen("move.w","(sp)+","d3");  /* ymax */
  544.     gen("move.w","(sp)+","d2");  /* xmax */
  545.          gen("move.w","_ymin","d1");     /* ymin */
  546.     gen("move.w","_xmin","d0");     /* xmin */
  547.         gen("jsr","_LVORectFill(a6)","  ");
  548.         enter_XREF("_LVORectFill"); 
  549.         enter_BSS("_xmin","ds.w 1");
  550.         enter_BSS("_ymin","ds.w 1");
  551.       }
  552.       else
  553.       {
  554.         /* draw line */
  555.         gen("move.l","_RPort","a1");
  556.         gen("move.l","_GfxBase","a6");
  557.     gen("move.w","(sp)+","d1");  /* y2 */
  558.     gen("move.w","(sp)+","d0");  /* x2 */
  559.     /* already moved to x1,y1 */
  560.         gen("jsr","_LVODraw(a6)","  ");
  561.         enter_XREF("_LVODraw");
  562.        enter_XREF("_LVOMove");
  563.     /* don't need to save x1 & x2 in _xmin & _ymin */
  564.     change(cx1,"nop","  ","  ");
  565.      change(cx2,"nop","  ","  ");
  566.     if (colorset)
  567.     {
  568.      change(cx3,"nop","  ","  ");
  569.      change(cx4,"nop","  ","  ");
  570.      change(cx5,"nop","  ","  ");
  571.      change(cx6,"nop","  ","  ");
  572.     }
  573.       }
  574.      }          
  575.     }
  576.    }
  577.    }
  578.   }
  579.  }
  580.  if (colorset)
  581.  {
  582.   /* change back to old pen */
  583.   gen("move.w","_fgdpen","d0");
  584.   gen("move.l","_RPort","a1");
  585.   gen("move.l","_GfxBase","a6");
  586.   gen("jsr","_LVOSetAPen(a6)","  ");
  587.   enter_XREF("_fgdpen");
  588.  }
  589. }
  590.  
  591. void color()
  592. {
  593.  /* foreground color */
  594.  insymbol();
  595.  make_sure_short(expr());
  596.  gen("move.w","(sp)+","d0");
  597.  gen("move.w","d0","_fg");   /* foreground pen for text color change */
  598.  gen("move.w","d0","_fgdpen");  /* change global foreground color holder */
  599.  gen("move.l","_RPort","a1");
  600.  gen("move.l","_GfxBase","a6");
  601.  gen("jsr","_LVOSetAPen(a6)","  ");
  602.  enter_XREF("_LVOSetAPen");
  603.  enter_XREF("_GfxBase");
  604.  enter_XREF("_RPort");
  605.  enter_XREF("_fgdpen");
  606.  enter_BSS("_fg","ds.w 1");
  607.  
  608.  if (sym == comma)
  609.  {
  610.   /* background color */
  611.   insymbol();
  612.   make_sure_short(expr());
  613.   gen("move.w","(sp)+","d0");
  614.   gen("move.w","d0","_bg");  /* background pen for text color change */
  615.   gen("move.w","d0","_bgpen"); /* change global background pen color */
  616.   gen("move.l","_RPort","a1");
  617.   gen("move.l","_GfxBase","a6");
  618.   gen("jsr","_LVOSetBPen(a6)","  ");
  619.   enter_XREF("_LVOSetBPen");
  620.   enter_XREF("_bgpen");
  621.   enter_BSS("_bg","ds.w 1");
  622.  }
  623.  else 
  624.  {
  625.   /* default to current background pen */
  626.   gen("move.w","_bgpen","_bg");
  627.   enter_XREF("_bgpen");
  628.   enter_BSS("_bg","ds.w 1");
  629.  }
  630.  
  631.  /* call text color change routine */
  632.  gen("move.w","_fg","d0");
  633.  gen("move.w","_bg","d1");
  634.  gen("jsr","_changetextcolor","  ");
  635.  enter_XREF("_changetextcolor");
  636.  enter_XREF("_DOSBase");
  637. }
  638.  
  639. void area()
  640. {
  641. BOOL relative;
  642.   /* AREA [STEP](x,y) */
  643.  
  644.   insymbol();
  645.   if (sym == stepsym)
  646.   { 
  647.    insymbol();
  648.    relative=TRUE; 
  649.   }
  650.   else relative=FALSE;
  651.    
  652.   if (sym != lparen) _error(14);
  653.   else
  654.      {
  655.       /* x-coordinate */
  656.       insymbol();
  657.       make_sure_short(expr());
  658.       if (sym != comma) _error(16);
  659.       else
  660.       {
  661.        /* y-coordinate */
  662.        insymbol();
  663.        make_sure_short(expr());
  664.        if (sym != rparen) _error(9);
  665.        else
  666.        {
  667.         /* pop y-coordinate */
  668.         gen("move.w","(sp)+","d1");
  669.     insymbol();
  670.        }
  671.       }
  672.       /* pop x-coordinate */
  673.       gen("move.w","(sp)+","d0");
  674.      }    
  675.  
  676.      /* include point in area info' */
  677.      if (relative)
  678.      {
  679.        gen("add.w","_last_areaX","d0");   /* d0 = x + lastareaY */
  680.        gen("add.w","_last_areaY","d1");   /* d1 = y + lastareaY */
  681.        enter_XREF("_last_areaX");
  682.        enter_XREF("_last_areaY");
  683.      }
  684.  
  685.      gen("jsr","_area","  ");
  686.  
  687.      enter_XREF("_area");
  688.      enter_XREF("_GfxBase");
  689.  
  690. }
  691.  
  692. areafill()
  693. {
  694.  /* AREAFILL [mode] */
  695.  
  696.  insymbol();
  697.  
  698.  if ((sym == shortconst) && ((shortval == 0) || (shortval == 1)))
  699.  { 
  700.   switch(shortval)
  701.   {
  702.    case 0 : gen("move.w","#0","d0"); break;
  703.    case 1 : gen("move.w","#1","d0"); break;
  704.   }
  705.   insymbol();
  706.  }
  707.  else
  708.      gen("move.w","#0","d0");
  709.   
  710.  gen("jsr","_areafill","  ");
  711.  
  712.  enter_XREF("_areafill");
  713.  enter_XREF("_GfxBase");
  714. }
  715.  
  716. pattern()
  717. {
  718. char addrbuf[40];
  719. char numbuf[20];
  720. BOOL linepatterncalled;
  721.  
  722.  /* PATTERN [line-pattern][,area-pattern] | RESTORE */ 
  723.  
  724.  insymbol();
  725.  
  726.  if (sym == restoresym) 
  727.  {
  728.   /* restore default pattern */
  729.   gen("move.l","#1","d1");    /* RESTORE flag */
  730.   gen("jsr","_linepattern","  ");
  731.   enter_XREF("_linepattern");
  732.   gen("move.l","#1","d1");    /* RESTORE flag */
  733.   gen("jsr","_areapattern","  ");
  734.   enter_XREF("_areapattern");
  735.   insymbol();
  736.  }
  737.  else
  738.  {
  739.   if (sym != comma)
  740.   {
  741.    /* get line-pattern */
  742.    make_sure_short(expr());
  743.    gen("move.w","(sp)+","d0");    /* line-pattern */
  744.    gen("move.l","#0","d1");    /* RESTORE flag */
  745.    gen("jsr","_linepattern","  ");
  746.    enter_XREF("_linepattern");
  747.    linepatterncalled=TRUE;
  748.   }
  749.   else
  750.       linepatterncalled=FALSE;
  751.  
  752.   if (sym == comma)
  753.   {
  754.    /* area-pattern */
  755.    insymbol();
  756.    if ((sym == ident) && (obj == variable) && (exist(id,array)))
  757.    {
  758.       if (curr_item->type != shorttype) _error(28);
  759.       else
  760.       {
  761.         if (!linepatterncalled)
  762.         {
  763.      /* line-pattern must be set
  764.         to $FFFF if none specified,
  765.         otherwise area-pattern doesn't
  766.         seem to work! 
  767.      */
  768.          gen("move.l","#1","d1");    /* set line-pattern to $FFFF */
  769.          gen("jsr","_linepattern","  ");
  770.          enter_XREF("_linepattern");
  771.     }
  772.  
  773.            /* get address of array */
  774.            itoa(-1*curr_item->address,addrbuf,10);
  775.            strcat(addrbuf,frame_ptr[lev]);
  776.            gen("move.l",addrbuf,"a0");    /* start address of array */
  777.  
  778.            /* size of array? */
  779.     sprintf(numbuf,"#%ld",curr_item->size/2);
  780.     gen("move.l",numbuf,"d0");    /* size of array */
  781.  
  782.         gen("move.l","#0","d1");    /* RESTORE flag */
  783.         gen("jsr","_areapattern","  ");
  784.         enter_XREF("_areapattern");
  785.     enter_XREF("_MathBase");
  786.     enter_XREF("_MathTransBase");    /* need to find Log2(size) */
  787.       }
  788.  
  789.      insymbol();
  790.    }
  791.    else
  792.        _error(28);  /* short integer array expected */ 
  793.   }
  794.  }
  795. }
  796.  
  797. void scroll()
  798. {
  799.  /* SCROLL (xmin,ymin)-(xmax,ymax),delta-x,delta-y */
  800.  
  801.  insymbol();
  802.  
  803.  if (sym != lparen) _error(14);
  804.  else
  805.  {
  806.   insymbol();
  807.   make_sure_short(expr());  /* xmin */
  808.   if (sym != comma) _error(16);
  809.   else
  810.   {
  811.    insymbol();
  812.    make_sure_short(expr());  /* ymin */
  813.    if (sym != rparen) _error(9);
  814.    else
  815.    {
  816.     insymbol();
  817.     if (sym != minus) _error(21);
  818.     else
  819.     {
  820.      insymbol();
  821.      if (sym != lparen) _error(14);
  822.      else
  823.      {
  824.       insymbol(); 
  825.       make_sure_short(expr());      /* xmax */
  826.       if (sym != comma) _error(16);
  827.       else
  828.       {
  829.        insymbol();
  830.        make_sure_short(expr());     /* ymax */
  831.        if (sym != rparen) _error(9);
  832.        else
  833.        {
  834.     insymbol();
  835.     if (sym != comma) _error(16);
  836.     else
  837.     {
  838.      insymbol();
  839.      make_sure_short(expr());   /* delta-x */     
  840.      if (sym != comma) _error(16);
  841.      else
  842.      {
  843.       insymbol();
  844.       make_sure_short(expr());  /* delta-y */    
  845.      }
  846.     }     
  847.        }
  848.  
  849.            /* pop parameters */
  850.     gen("move.w","(sp)+","d1");        /* delta-y */
  851.     gen("neg.w","d1","  ");            
  852.     gen("move.w","(sp)+","d0");        /* delta-x */
  853.     gen("neg.w","d0","  ");
  854.     gen("move.w","(sp)+","d5");          /* ymax */
  855.     gen("move.w","(sp)+","d4");          /* xmax */
  856.     gen("move.w","(sp)+","d3");          /* ymin */
  857.     gen("move.w","(sp)+","d2");          /* xmin */
  858.  
  859.     /* call ScrollRaster function */
  860.     gen("movea.l","_RPort","a1");        /* RastPort */
  861.     gen("movea.l","_GfxBase","a6");
  862.     gen("jsr","_LVOScrollRaster(a6)","  ");
  863.     enter_XREF("_LVOScrollRaster");
  864.     enter_XREF("_GfxBase");
  865.     enter_XREF("_RPort");
  866.        } 
  867.       }
  868.      }
  869.     }
  870.    }
  871.   }
  872.  }
  873.  
  874. void text_style()
  875. {
  876. /* STYLE n */
  877. int stype;
  878.  
  879.   insymbol();
  880.   stype = expr();
  881.  
  882.   if (stype == stringtype)
  883.     _error(4);
  884.   else
  885.   {
  886.       if (make_integer(stype) == shorttype) make_long(); 
  887.     gen("jsr","_change_text_style","  ");
  888.     gen("addq","#4","sp");
  889.     enter_XREF("_change_text_style");
  890.     enter_XREF("_GfxBase");
  891.   }
  892. }
  893.  
  894. void text_font()
  895. {
  896. /* FONT name,size */
  897. int ftype;
  898.  
  899.   insymbol();
  900.   
  901.   if (expr() != stringtype)
  902.       _error(4);
  903.   else
  904.   {
  905.     if (sym != comma)
  906.         _error(16);
  907.     else
  908.     {
  909.         insymbol();
  910.           ftype = expr();
  911.  
  912.           if (ftype == stringtype)
  913.             _error(4);
  914.           else
  915.           {
  916.               if (make_integer(ftype) == shorttype) make_long();
  917.  
  918.             gen("jsr","_change_text_font","  ");
  919.             gen("addq","#8","sp");
  920.             enter_XREF("_change_text_font");
  921.             enter_XREF("_GfxBase");
  922.           }
  923.     }        
  924.   }
  925. }
  926.  
  927. void gfx_get()
  928. {
  929. /* GET */
  930.  insymbol();
  931. }
  932.  
  933. void gfx_put()
  934. {
  935. /* PUT */
  936.  insymbol();
  937. }
  938.